﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using ProfessorLib.Basic;
using System.Data;

namespace ProfessorLib.Repositorio
{
    public class RepProfessor
    {
        private SqlConnection conexao;
        private string stringConexao = @"Data Source=VITOR-PC\SQLEXPRESS;Initial Catalog=Escola; user id=sa; pwd=jva;";
        private static RepProfessor instancia;

        private RepProfessor()
        {
        }


        public static RepProfessor getInstancia()
        {
            if (instancia == null)
            {
                instancia = new RepProfessor();
                return instancia;
            }
            return instancia;
        }


        public void inserir(Professor obj)
        {

            conexao = new SqlConnection(stringConexao);

            try
            {

                SqlCommand sql = new SqlCommand("insert into Funcionario values (@NomeFunc, @Endereço, @Telefone, @Email, @Sexo, @Função, @Titulação)" 
                    +"\n update Professor_Disciplina set CodDisc=(select CodDisc from disciplina where NomeDisc=@NomeDisc) where MatFunc=@@IDENTITY", conexao);
                
                sql.Parameters.AddWithValue("@NomeFunc", obj.Nome);
                sql.Parameters.AddWithValue("@Endereço", obj.Endereco);
                sql.Parameters.AddWithValue("@Telefone", obj.Fone);
                sql.Parameters.AddWithValue("@Email", obj.Email);
                sql.Parameters.AddWithValue("@Sexo", obj.Sexo);
                sql.Parameters.AddWithValue("@Função", obj.Funcao);
                sql.Parameters.AddWithValue("@Titulação", obj.Titulacao);
                sql.Parameters.AddWithValue("@NomeDisc", obj.Disciplina.Nome);

                conexao.Open();

                sql.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                conexao.Dispose();
            }

        }

        public void alterar(Professor obj)
        {
            conexao = new SqlConnection(stringConexao);

            try
            {

                SqlCommand sql = new SqlCommand("update Funcionario set NomeFunc=@NomeFunc, Endereço=@Endereço, Telefone=@Telefone, Email=@Email, Sexo=@Sexo, Função=@Função, Titulação=@Titulação where MatFunc=@MatFunc"
                    + "\n update Professor_Disciplina set CodDisc=(select CodDisc from disciplina where NomeDisc=@NomeDisc) where MatFunc=@MatFunc", conexao);

                sql.Parameters.AddWithValue("@MatFunc", obj.Matricula);
                sql.Parameters.AddWithValue("@NomeFunc", obj.Nome);
                sql.Parameters.AddWithValue("@Endereço", obj.Endereco);
                sql.Parameters.AddWithValue("@Telefone", obj.Fone);
                sql.Parameters.AddWithValue("@Email", obj.Email);
                sql.Parameters.AddWithValue("@Sexo", obj.Sexo);
                sql.Parameters.AddWithValue("@Função", obj.Funcao);
                sql.Parameters.AddWithValue("@Titulação", obj.Titulacao);
                sql.Parameters.AddWithValue("@NomeDisc", obj.Disciplina.Nome);

                conexao.Open();

                sql.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                conexao.Dispose();
            }
        }

        public List<Professor> listar()
        {

            conexao = new SqlConnection(stringConexao);

            try
            {
                List<Professor> lista = new List<Professor>();
                SqlCommand sql = new SqlCommand("select * from Funcionario inner join Professor_Disciplina on Professor_Disciplina.MatFunc=Funcionario.MatFunc inner join Disciplina on Professor_Disciplina.CodDisc=Disciplina.CodDisc", conexao);

                conexao.Open();

                SqlDataReader dr = sql.ExecuteReader();

                while (dr.Read())
                {
                    Professor professor = new Professor();
                    professor.Matricula = Convert.ToInt32(dr["MatFunc"]);
                    professor.Nome = dr["NomeFunc"].ToString();
                    professor.Endereco = dr["Endereço"].ToString();
                    professor.Fone = dr["Telefone"].ToString();
                    professor.Email = dr["Email"].ToString();
                    professor.Sexo = Convert.ToChar(dr["Sexo"]);
                    professor.Funcao = dr["Função"].ToString();
                    professor.Titulacao = dr["Titulação"].ToString();

                    Disciplina disciplina = new Disciplina();
                    disciplina.Codigo = Convert.ToInt32(dr["CodDisc"]);
                    disciplina.Nome = dr["NomeDisc"].ToString();

                    professor.Disciplina = disciplina;
                    lista.Add(professor);
                }
                return lista;
               
            }
            catch (Exception e)
            {

                throw e;
            }


            finally
            {

                conexao.Dispose();

            }
        }

        public List<Professor> listarAlterar(Professor obj)
        {

            conexao = new SqlConnection(stringConexao);

            try
            {
                List<Professor> lista = new List<Professor>();
                SqlCommand sql = new SqlCommand("select * from Funcionario inner join Professor_Disciplina on Professor_Disciplina.MatFunc=Funcionario.MatFunc where Funcionario.MatFunc != @MatFunc", conexao);

                sql.Parameters.AddWithValue("@MatFunc", obj.Matricula);

                conexao.Open();

                SqlDataReader dr = sql.ExecuteReader();

                while (dr.Read())
                {
                    Professor professor = new Professor();
                    professor.Matricula = Convert.ToInt32(dr["MatFunc"]);
                    professor.Nome = dr["NomeFunc"].ToString();
                    professor.Endereco = dr["Endereço"].ToString();
                    professor.Fone = dr["Telefone"].ToString();
                    professor.Email = dr["Email"].ToString();
                    professor.Sexo = Convert.ToChar(dr["Sexo"]);
                    professor.Funcao = dr["Função"].ToString();
                    professor.Titulacao = dr["Titulação"].ToString();
                    Disciplina disciplina = new Disciplina();
                    disciplina.Codigo = Convert.ToInt32(dr["CodDisc"]);

                    professor.Disciplina = disciplina;

                    lista.Add(professor);
                }
                return lista;

            }
            catch (Exception e)
            {

                throw e;
            }


            finally
            {

                conexao.Dispose();

            }
        }

    }
}
